#include "serial.h"
#include "ui_serial.h"

#include <qdebug.h>

Serial::Serial(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Serial)
{
    ui->setupUi(this);
    system_init();
}

Serial::~Serial()
{
    delete ui;
}

bool Serial::openPort()
{
    // 已经连接，再重新连接则跳过
    if (m_status) {
        return true;
    }
    QStringList portList;
    portList << "COM1" << "COM2" << "COM3" << "COM4"
                "COM5" << "COM6" << "COM7" << "COM8";

    QSerialPort::BaudRate baudRates[] = {
        QSerialPort::Baud115200,
        QSerialPort::Baud57600,
        QSerialPort::Baud38400,
        QSerialPort::Baud19200,
        QSerialPort::Baud9600,
        QSerialPort::Baud4800,
        QSerialPort::Baud2400,
        QSerialPort::Baud1200
    };
    int index;
    // 获取串口名称并设置
    index = ui->cbCom->currentIndex();
    m_port.setPortName(portList[index]);
    // 获取波特率并设置
    index = ui->cbBaudRate->currentIndex();
    m_port.setBaudRate(baudRates[index]);
    // 打开端口
    bool status = m_port.open(QIODevice::ReadWrite);
    if (status) {
        ui->groupBox_2->setTitle("连接");
        m_status = true;
        return true;
    }
    ui->groupBox_2->setTitle("串口打开失败");
    return false;
}

void Serial::closePort()
{
    ui->groupBox_2->setTitle("断开");
    // 本身没有连接则退出
    if (!m_status) {
        return ;
    }
    m_status = false;
    m_port.close();
}

void Serial::sendData()
{
    // 没有连接成功则退出
    if (!m_status) {
        return ;
    }
    // 获取输入框数据写入串口
    QString data = ui->lineEdit->text();
    m_port.write(data.toLatin1());
}

void Serial::sendData(QString content)
{
    // 没有连接成功则退出
    if (!m_status) {
        return ;
    }
    m_port.write(content.toLatin1());
}

void Serial::readData()
{
    QByteArray data = m_port.readAll();

    // 当勾上十六进制显示时，以十六进制显示
    if (ui->checkHex->isChecked()) {
        ui->plainTextEdit->insertPlainText(QString(data.toHex().append(' ')));
    } else {
        ui->plainTextEdit->insertPlainText(QString(data.append(' ')));
    }
}

void Serial::system_init()
{
    // 默认连接状态为断开
    m_status = false;
    // 设置默认奇偶校验位，数据位，停止位
    m_port.setParity(QSerialPort::NoParity);
    m_port.setDataBits(QSerialPort::Data8);
    m_port.setStopBits(QSerialPort::OneStop);
    // 设置连接、关闭、接收和发送对应的执行方法
    connect(ui->btnOpen, &QPushButton::clicked, this, &Serial::openPort);
    connect(ui->btnSend, SIGNAL(clicked()), this, SLOT(sendData()));
    connect(&m_port, &QSerialPort::readyRead, this, &Serial::readData);
    connect(ui->btnClose, &QPushButton::clicked, this, &Serial::closePort);
}

void Serial::on_btnBackSpeech_clicked()
{
    // 发射显示Widget,隐藏Serial窗口的信号
    emit showSpeechWidget();
}
